package co.edu.ucatolica.sislab.persistence.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import co.edu.ucatolica.sislab.persistence.DatabaseException;
import co.edu.ucatolica.sislab.persistence.DatabasePersistorHelper;
import co.edu.ucatolica.sislab.persistence.dto.EquipoDTO;
import co.edu.ucatolica.sislab.persistence.utils.DatabaseOperations;
import co.edu.ucatolica.sislab.persistence.utils.PersistenceUtils;
import co.edu.ucatolica.sislab.persistence.utils.SQLSISLABDBConstants;
import co.edu.ucatolica.sislab.utils.DatabaseTables;

public class EquiposPersistorHelper {
	private static Logger logger = LoggerFactory.getLogger(EquiposPersistorHelper.class);
	
	public static Long createEquipo(Long transactionNumber, EquipoDTO equiposDTO) throws DatabaseException {
		Connection dbConnection = null;
		PreparedStatement ps = null;
		try {
			dbConnection = DatabasePersistorHelper.getConexion(transactionNumber);
			String sql = DatabasePersistorHelper.getSql(SQLSISLABDBConstants.SQL_CREATE_EQUIPOS_DATA);
			
			if ((dbConnection != null) && (sql != null)) {
				ps = dbConnection.prepareStatement(sql);
				ps.setString(1, equiposDTO.getNombre());
				ps.setLong(2, equiposDTO.getSalaId());
				ps.setLong(3, equiposDTO.getEstadoId());
				ps.setLong(3, equiposDTO.getDisponibilidadId());											
				ps.execute();
				
				return DatabasePersistorHelper.getIdentity(dbConnection);
			}
		} catch (DatabaseException e) {
			logger.error("No fue posible traer los datos de la tabla equipos: " + equiposDTO.getNombre() + " - " + e.getMessage());
			throw new DatabaseException(DatabaseTables.EQUIPOS, DatabaseOperations.SELECT, e.toString());
		} catch (SQLException e) {
			logger.error("No fue posible traer los datos de la tabla equipos: " + equiposDTO.getNombre() + " - " + e.getMessage());
			throw new DatabaseException(DatabaseTables.EQUIPOS, DatabaseOperations.SELECT, e.toString());
		} finally {
			PersistenceUtils.closeConnectionIssues(ps);
		}
		return null;		
	}

	public static List<EquipoDTO> getEquiposByIdSala(Long transactionNumber, Long idSala) throws DatabaseException {
		Connection dbConnection = null;
		PreparedStatement ps = null;
		try {
			dbConnection = DatabasePersistorHelper.getConexion(transactionNumber);
			String sql = DatabasePersistorHelper.getSql(SQLSISLABDBConstants.SQL_QUERY_EQUIPOS_BY_SALA_ID);
			if ((dbConnection != null) && (sql != null)) {
				ps = dbConnection.prepareStatement(sql);
				ps.setLong(1, idSala);
				ps.setLong(2, 1);
				ResultSet rs = ps.executeQuery();
				List<EquipoDTO> equiposDTOs = new ArrayList<EquipoDTO>();
				while(rs.next()){
					EquipoDTO equiposDTO = new EquipoDTO();
					equiposDTO.setId(rs.getLong("id"));
					equiposDTO.setNombre(rs.getString("nombre"));
					equiposDTO.setReferencia(rs.getString("referencia"));
					equiposDTO.setSalaId(rs.getLong("salas_id"));
					equiposDTO.setDisponibilidadId(rs.getLong("disponibilidad_id"));
					equiposDTO.setEstadoId(rs.getLong("estado_id"));
					equiposDTOs.add(equiposDTO);
				}
				return equiposDTOs;
			}
		} catch (DatabaseException e) {
			logger.error("No fue posible traer los datos de la tabla equipos con sala id: " + idSala + " - " + e.getMessage());
			throw new DatabaseException(DatabaseTables.EQUIPOS, DatabaseOperations.SELECT, e.toString());
		} catch (SQLException e) {
			logger.error("No fue posible traer los datos de la tabla equipos con sala id: " + idSala + " - " + e.getMessage());
			throw new DatabaseException(DatabaseTables.EQUIPOS, DatabaseOperations.SELECT, e.toString());
		} finally {
			PersistenceUtils.closeConnectionIssues(ps);
		}
		return null;
	}

	public static EquipoDTO getEquipoById(Long transactionNumber, Long idEquipo)  throws DatabaseException {
		Connection dbConnection = null;
		PreparedStatement ps = null;
		try {
			dbConnection = DatabasePersistorHelper.getConexion(transactionNumber);
			String sql = DatabasePersistorHelper.getSql(SQLSISLABDBConstants.SQL_SELECT_EQUIPO_BY_ID);
			if ((dbConnection != null) && (sql != null)) {
				ps = dbConnection.prepareStatement(sql);
				ps.setLong(1, idEquipo);
				ResultSet rs = ps.executeQuery();
				if(rs.next()){
					EquipoDTO equiposDTO = new EquipoDTO();
					equiposDTO.setId(rs.getLong("id"));
					equiposDTO.setNombre(rs.getString("nombre"));
					equiposDTO.setReferencia(rs.getString("referencia"));
					equiposDTO.setSalaId(rs.getLong("salas_id"));
					equiposDTO.setDisponibilidadId(rs.getLong("disponibilidad_id"));
					equiposDTO.setEstadoId(rs.getLong("estado_id"));
					return equiposDTO;
				}
			}
		} catch (DatabaseException e) {
			logger.error("No fue posible traer los datos del equipod con id: " + idEquipo + " - " + e.getMessage());
			throw new DatabaseException(DatabaseTables.EQUIPOS, DatabaseOperations.SELECT, e.toString());
		} catch (SQLException e) {
			logger.error("No fue posible traer los datos del equipod con id: " + idEquipo + " - " + e.getMessage());
			throw new DatabaseException(DatabaseTables.EQUIPOS, DatabaseOperations.SELECT, e.toString());
		} finally {
			PersistenceUtils.closeConnectionIssues(ps);
		}
		return null;
	}

	public static List<EquipoDTO> getEquipos(Long transactionNumber) throws DatabaseException {
		Connection dbConnection = null;
		PreparedStatement ps = null;
		try {
			dbConnection = DatabasePersistorHelper.getConexion(transactionNumber);
			String sql = DatabasePersistorHelper.getSql(SQLSISLABDBConstants.SQL_QUERY_EQUIPOS);
			if ((dbConnection != null) && (sql != null)) {
				ps = dbConnection.prepareStatement(sql);
				ps.setLong(1, 1);
				ResultSet rs = ps.executeQuery();
				List<EquipoDTO> equiposDTOs = new ArrayList<EquipoDTO>();
				while(rs.next()){
					EquipoDTO equiposDTO = new EquipoDTO();
					equiposDTO.setId(rs.getLong("id"));
					equiposDTO.setNombre(rs.getString("nombre"));
					equiposDTO.setReferencia(rs.getString("referencia"));
					equiposDTO.setSalaId(rs.getLong("salas_id"));
					equiposDTO.setDisponibilidadId(rs.getLong("disponibilidad_id"));
					equiposDTO.setEstadoId(rs.getLong("estado_id"));
					equiposDTOs.add(equiposDTO);
				}
				return equiposDTOs;
			}
		} catch (DatabaseException e) {
			logger.error("No fue posible traer los equipos de todas las salas - " + e.getMessage());
			throw new DatabaseException(DatabaseTables.EQUIPOS, DatabaseOperations.SELECT, e.toString());
		} catch (SQLException e) {
			logger.error("No fue posible traer los equipos de todas las salas - " + e.getMessage());
			throw new DatabaseException(DatabaseTables.EQUIPOS, DatabaseOperations.SELECT, e.toString());
		} finally {
			PersistenceUtils.closeConnectionIssues(ps);
		}
		return null;
	}

}
